/**
 * 默认的分析器类，用于处理和分析字符串数据
 *
 * @param pluginsManager 插件管理器，用于获取分析前后可插件化处理的策略
 */
class DefaultAnalyzer(pluginsManager: PluginsManager) : Analyzable {

    // 初始化在分析之前的处理插件列表
    private val beforeAnalyzableList: List<BeforeAnalyzable> = pluginsManager.getBeforeAnalyzablePlugins()

    // 初始化在分析之后的处理插件列表
    private val afterAnalyzableList: List<AfterAnalyzable> = pluginsManager.getAfterAnalyzablePlugins()

    /**
     * 对给定的字符串进行分析处理
     *
     * @param origin 原始输入字符串
     * @return 处理后的字符串结果
     */
    override fun analyze(origin: String): String {
        // 在分析前进行处理
        val originHandler = beforeAnalyze(origin)
        // 执行主要的分析逻辑
        val result = doAnalyze(originHandler)
        // 在分析后进行处理
        val resultHandler = afterAnalyze(result)
        return resultHandler
    }

    /**
     * 执行主要的分析逻辑
     *
     * @param origin 分析前处理过的字符串
     * @return 经过主要分析逻辑处理后的字符串
     */
    private fun doAnalyze(origin: String): String {
        val stringBuilder: StringBuilder = StringBuilder()
        var inTodoBlock = false
        for (i in origin.lines()) {
            // 检测并处理待办事项块的开始
            if (i.contains("- [ ] ")) {
                stringBuilder.append(i)
                stringBuilder.append("\n")
                inTodoBlock = true
                continue
            } else if (i.contains("- [x] ")) {
                // 检测并处理待办事项块的结束
                inTodoBlock = false
            }
            // 根据是否在待办事项块中决定是否追加当前行
            if (inTodoBlock) {
                stringBuilder.append(i)
                stringBuilder.append("\n")
            }
        }
        return stringBuilder.toString()
    }

    /**
     * 在主要分析逻辑之前的预处理
     *
     * @param origin 原始输入字符串
     * @return 预处理后的字符串，供后续分析使用
     */
    private fun beforeAnalyze(origin: String): String {
        var originClone: String = origin
        // 遍历并应用所有预处理插件
        for (plugin in beforeAnalyzableList) {
            originClone = plugin.work(originClone)
        }
        return originClone
    }

    /**
     * 在主要分析逻辑之后的后处理
     *
     * @param result 主要分析逻辑处理后的字符串
     * @return 后处理后的字符串，作为最终结果
     */
    private fun afterAnalyze(result: String): String {
        var resultClone: String = result
        // 遍历并应用所有后处理插件
        for (plugin in afterAnalyzableList) {
            resultClone = plugin.work(result)
        }
        return resultClone
    }

}
